// 测试 reduce 和 reduceRight

const numbers = [ 2  , 1 , 5 , 6 , 3 , 4 ];

let sum = 0 ;
// 用 forEach 遍历数组并累加每个元素值
numbers.forEach( e => sum += e );
console.log( sum );

// Array.prototype.reduce( (reducer(accumulator, currentValue[, index[, array]]) [, initialValue] )
// 对数组中的每个元素执行一个由您提供的 reducer 函数(升序执行(从左到右))，将其结果汇总为单个返回值
// reducer 函数接收4个参数:
// Accumulator (acc) (累计器)
// Current Value (cur) (当前值)
// Current Index (idx) (当前索引)
// Source Array (src) (源数组)
// 您的 reducer 函数的返回值分配给累计器，该返回值在数组的每个迭代中被记住，并最后成为最终的单个结果值。

// let total = numbers.reduce( (accumulator,current) => accumulator + current );
let total = numbers.reduce( function(accumulator,current){
    console.log( accumulator , current );
    return accumulator + current ;
});
console.log( total );

console.log( '- '.repeat(10) );

let zeroExists = numbers.some( e => e == 0 );
console.log( zeroExists );

let zeroNotExists = numbers.every( e => e != 0 );
console.log( zeroNotExists );

console.log( '- '.repeat(10) );

// Array.prototype.reduceRight( (reducer(accumulator, currentValue[, index[, array]]) [, initialValue] )
// 对数组中的每个元素执行一个由您提供的 reducer 函数(降序执行(从右到左))，将其结果汇总为单个返回值
let product = numbers.reduceRight( (accumulator,current)=> {
    console.log( accumulator , current );
    return accumulator * current ;
});

console.log( product );

console.log( '- '.repeat(10) );

const freight = 25 ; // 运费

let cart = [
    { id: 1234 , name: '中兴Axon30' , brand: '中兴' , price: 2998 , num: 2 },
    { id: 2324 , name: '小米MIX4 5G手机' , brand: '小米' , price: 4998 , num: 1 },
    { id: 7754 , name: 'HUAWEI Mate 40 Pro 4G' , brand: '小米' , price: 6599 , num: 1 }
];

// 以运费(freight)为初始值
// const totalPrice = cart.reduce( (prev,curr) =>  prev + curr.price * curr.num , freight );

// 没有以运费为初始值
const totalPrice = cart.reduce( (prev,curr)=>{
    // 若未显式指定 reduce 函数的第二个参数值，
    // 则在这里需要对 prev 作检查
    if( typeof prev === 'object' ) {
        console.log( prev , curr );
        return prev.price * prev.num + curr.price * curr.num ;
    }
    // 第一次以后 prev 都是 number ，所以可以直接累加
    return prev + curr.price * curr.num ;
});
console.log( totalPrice );
